// use sea_orm::entity::prelude::*;

use chrono::{NaiveDateTime};
// use sea_orm::{ActiveModelBehavior, DeriveEntityModel, DeriveRelation, EnumIter, Related, RelationDef, RelationTrait};
use rust_decimal::Decimal;
use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};

// Model 用于存储查询结果的 Rust 结构体
// DeriveEntityModel 宏完成了定义实体与关联模型、列和主键的所有繁重工作。
// 数据模型(Model)  数据模型是代表数据库表中的行的结构体。它包含了所有列的字段，并且通常包含一些元数据，比如是否为主键等。
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)]
#[sea_orm(table_name = "t_user")]
pub struct Model {
    #[sea_orm(primary_key)]
    pub id: u32,
    pub name: String,
    pub password: String,
    pub age: u32,
    #[sea_orm(column_type = "Double")]
    pub score: f64,
    pub gender: bool,
    pub price: Decimal,
    #[sea_orm(column_type = "DateTime", nullable)]
    pub create_time: Option<NaiveDateTime>,
    #[sea_orm(column_type = "DateTime", nullable)]
    pub update_time: Option<NaiveDateTime>,
}


// 关系(Relation)     关系用于定义实体之间的关联，比如一对多、多对多或者一对一的关系。这有助于在查询时获取相关联的数据。
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {
    // #[sea_orm(has_many = "super::blog::Entity")]
    // Blog,
}

// Related 定义特征边界可以帮助您一起查询相关实体，特别是在多对多关系中很有帮助。
// impl Related<super::blog::Entity> for Entity {
//     fn to() -> RelationDef {
//         Relation::Blog.def()
//     }
// }


// 活动模型(ActiveModel)    活动模型是用于创建、更新和删除实体的结构体。它与数据模型非常相似，但允许字段被标记为Set或NotSet，这使得你可以只更新某些字段，而不是整个实体。
// 活动模型行为(ActiveModelBehavior)  活动模型行为是一些可以附加到活动模型上的功能，比如自动填充时间戳。
impl ActiveModelBehavior for ActiveModel {}

// 不要删除关系枚举（Relation）或活动模型行为（ActiveModelBehavior） impl 块，即使它们是空的。




#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
#[sea_orm(table_name = "users")]
pub struct User {
    #[sea_orm(primary_key)]
    pub id: i32,
    pub name: String,
    pub email: String,
}

async fn find_user_by_email(email: &str) -> Option<User> {
    Entity::find()
        .filter(Column::Email.eq(email))
        .one(db_connection)
        .await
        .ok()
}